package company;

/**10. 正则表达式匹配
 * 给你一个字符串 s 和一个字符规律 p，请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
 *
 * '.' 匹配任意单个字符
 * '*' 匹配零个或多个前面的那一个元素
 * 所谓匹配，是要涵盖 整个 字符串 s的，而不是部分字符串。
 *
 *  
 * 示例 1：
 *
 * 输入：s = "aa", p = "a"
 * 输出：false
 * 解释："a" 无法匹配 "aa" 整个字符串。
 * 示例 2:
 *
 * 输入：s = "aa", p = "a*"
 * 输出：true
 * 解释：因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此，字符串 "aa" 可被视为 'a' 重复了一次。
 *
 */

import java.util.Scanner;

/**
 * 思路：
 * 1.有s,p字符串，p是正则
 * 2、p中j的字符是".", 那么是可以匹配s中任意一个字符，那么此时一定是匹配的，只需要决定于前i-1，j-1是否匹配dp[i][j] = dp[i-1][j-1]
 * 3、如果p中j字符和s中i字符相等，那么此时只需要看i-1，j-1 是否匹配 dp[i][j] = dp[i-1][j-1]
 * 4、如果p中j字符和i字符串不相等，那么此时是不匹配 dp[i][j] =false
 * 5、如过p中j字符是*，且 j-1和i相同。*是可以匹配j-1字符任意多个，所以需要看j-2之前是否匹配，如果是匹配，那么为true，否则，看i-1，j是否为匹配，为匹配，说明i-1出现过i，现在只不过i行复制了i-1，所以
 * dp[i][j] = dp[i][j-2]|| dp[i-1][j]
 *
 */
public class IsMatch {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        int len = s.length();
        String p = sc.nextLine();
        int len1 = p.length();
        boolean[][] dp = new boolean[len+1][len1+1];

        // 初始化
        dp[0][0] = true;
        for (int i = 1; i <=len; i++) {
            for (int j = 1; j <=len1; j++) {
                if (s.charAt(i-1) == p.charAt(j-1)) {
                    dp[i][j] = dp[i-1][j];
                }
                if (p.charAt(j-1) == '.') {
                    dp[i][j] = dp[i-1][j-1];
                }
                if (p.charAt(j-1) == '*' && p.charAt(j - 2) == s.charAt(i-1)) {
                    dp[i][j] = dp[i-1][j] || dp[i][j -1];
                }
            }
        }
        System.out.println(dp[len][len1]);
    }
}
